using LightCAD.MathLib;
using System;
using System.Collections;
using System.Collections.Generic;


namespace LightCAD.Three
{
    public class DodecahedronGeometry : PolyhedronGeometry
    {
        #region constructor
        public DodecahedronGeometry(double radius = 1, int detail = 0)
            : base(makeVertices(), makeIndices(), radius, detail)
        {
            this.type = "DodecahedronGeometry";
            this.parameters = new PolyhedronGeometry.Parameters()
            {
                radius = radius,
                detail = detail
            };
        }
        private static ListEx<double> makeVertices()
        {
            var t = (1 + Math.Sqrt(5)) / 2;
            var r = 1 / t;
            var vertices = new ListEx<double>{
                    // (±1, ±1, ±1)
                    - 1, -1, -1, -1, -1, 1,
                    -1, 1, -1, -1, 1, 1,
                    1, -1, -1, 1, -1, 1,
                    1, 1, -1, 1, 1, 1,
                    // (0, ±1/φ, ±φ)
                    0, -r, -t, 0, -r, t,
                    0, r, -t, 0, r, t,
                    // (±1/φ, ±φ, 0)
                    -r, -t, 0, -r, t, 0,
                    r, -t, 0, r, t, 0,
                    // (±φ, 0, ±1/φ)
                    -t, 0, -r, t, 0, -r,
                    -t, 0, r, t, 0, r
                };
            return vertices;
        }

        private static ListEx<int> makeIndices()
        {
            var indices = new ListEx<int> {
                    3, 11, 7, 3, 7, 15, 3, 15, 13,
                    7, 19, 17, 7, 17, 6, 7, 6, 15,
                    17, 4, 8, 17, 8, 10, 17, 10, 6,
                    8, 0, 16, 8, 16, 2, 8, 2, 10,
                    0, 12, 1, 0, 1, 18, 0, 18, 16,
                    6, 10, 2, 6, 2, 13, 6, 13, 15,
                    2, 16, 18, 2, 18, 3, 2, 3, 13,
                    18, 1, 9, 18, 9, 11, 18, 11, 3,
                    4, 14, 12, 4, 12, 0, 4, 0, 8,
                    11, 9, 5, 11, 5, 19, 11, 19, 7,
                    19, 5, 14, 19, 14, 4, 19, 4, 17,
                    1, 12, 14, 1, 14, 5, 1, 5, 9
                };
            return indices;
        }
        #endregion
    }
}
